#include <iostream>
#include <string>
#include <unistd.h>
using namespace std;

#define MAX 10 // 最大的人数
// 封装联系人结构体
struct Person
{
    /* data */
    string name;
    string sex;
    int age;
};
// 封装通讯录结构
struct AddressBook
{
    /* data */
    Person personArray[MAX];
    int m_size;
};

// 封装显示菜单的函数
void showMenu()
{
    for (int i = 0; i < 9; i++)
    {
        /* code */
        switch (i)
        {
        case 0:
            if (i == 0 || i == 8)
            {
                for (int j = 0; j < 27; j++)
                {
                    /* code */
                    cout << '*';
                }
                cout << endl;
            }
            break;
        case 1:
            cout << "*****  1、添加联系人  *****" << endl;
            break;
        case 2:
            cout << "*****  2、显示联系人  *****" << endl;
            break;
        case 3:
            cout << "*****  3、删除联系人  *****" << endl;
            break;
        case 4:
            cout << "*****  4、查找联系人  *****" << endl;
            break;
        case 5:
            cout << "*****  5、修改联系人  *****" << endl;
            break;
        case 6:
            cout << "*****  6、清空联系人  *****" << endl;
            break;
        case 7:
            cout << "*****  0、退出通讯录  *****" << endl;
            break;
        case 8:
            if (i == 0 || i == 8)
            {
                for (int j = 0; j < 27; j++)
                {
                    /* code */
                    cout << '*';
                }
                cout << endl;
            }
            break;
        default:
            break;
        }
    }
}

// 添加联系人方法
void addPerson(AddressBook *a)
{
    //  存储创建的时候的人员
    Person p;
    cout << "请输入添加人姓名" << endl;
    cin >> p.name;
    cout << "请输入添加人年龄" << endl;
    cin >> p.age;
    int sexNum = 1;
    cout << "请输入添加人性别： 1--男；2--女" << endl;
    do
    {
        cin >> sexNum;
        if (sexNum == 1)
        {
            p.sex = "男";
            break;
        }
        else if (sexNum == 2)
        {
            p.sex = "女";
            break;
        }
        else
        {
            cout << "输入不合规范，请重新输入" << endl;
        }
    } while (true);

    a->personArray[a->m_size] = p;
    a->m_size++;
    cout << "添加成功" << endl;
    system("clear");
}

// 显示联系人
void showPerson(AddressBook *abs)
{
    if (abs->m_size == 0)
    {
        /* code */
        cout << "当前记录为空" << endl;
    }

    for (int i = 0; i < abs->m_size; i++)
    {
        /* code */
        cout << "姓名：" << abs->personArray[i].name << "\t";
        cout << "年龄：" << abs->personArray[i].age << "\t";
        cout << "性别q：" << abs->personArray[i].sex << "\t" << endl;
    }
}
// 检查这个人是否存在
int isHavaThePeople(string name, AddressBook *abs)
{
    int flag = -1;
    for (int i = 0; i < abs->m_size; i++)
    {
        /* code */
        if (abs->personArray[i].name == name)
        {
            /* code */
            flag = i;
            break;
        }
    }
    return flag;
}
// 删除该人的数据
void deletePersonData(int index, AddressBook *abs)
{
    for (int i = index; i < abs->m_size; i++)
    {
        /* code */
        abs->personArray[i] = abs->personArray[i + 1];
    }
    if (abs->m_size != 0)
    {
        abs->m_size--;
        cout << "删除成功" << endl;
    }
}
// 删除联系人
void deletePerson(AddressBook *abs)
{
    int flag = -1;
    string deletePersonName;
    do
    {
        // 提示输入要删除人的名字
        cout << "请输入要删除的人的名字，输入0退出" << endl;
        cin >> deletePersonName;
        if (deletePersonName == "0")
        {
            return;
        }
        // 检查这个人是否存在
        flag = isHavaThePeople(deletePersonName, abs);
        cout << "有这个人吗？" << flag << endl;
        // 不存在给提示
        if (flag == -1)
        {
            cout << "不存在这个人的数据，请重新输入" << endl;
        }
    } while (flag == -1);

    // 删除这个人的数据
    deletePersonData(flag, abs);
}
// 输出该下标的联系人信息
void printIndexPerson(int index, AddressBook *abs)
{
    cout << "姓名：" << abs->personArray[index].name << "\t"
         << "年龄：" << abs->personArray[index].age << "\t"
         << "性别：" << abs->personArray[index].sex << endl;
}
// 查找联系人
void findPerson(AddressBook *abs)
{
    int flag = -1;
    string deletePersonName;
    do
    {
        // 提示输入要删除人的名字
        cout << "请输入要查找的人的名字，输入0退出" << endl;
        cin >> deletePersonName;
        if (deletePersonName == "0")
        {
            return;
        }
        // 检查这个人是否存在
        flag = isHavaThePeople(deletePersonName, abs);
        cout << "这个人的下标" << flag << endl;
        // 不存在给提示
        if (flag == -1)
        {
            cout << "不存在这个人的数据，请重新输入" << endl;
        }
    } while (flag == -1);
    // 输出这个人的信息
    printIndexPerson(flag, abs);
}

// 修改联系人
void editPerson(AddressBook *abs)
{
    string name;
    cout << "请输入要修改的联系人姓名" << endl;
    cin >> name;
    int flag = isHavaThePeople(name, abs);
    if (flag == -1)
    {
        cout << "该联系人不存在" << endl;
    }
    else
    {
        // 修改联系人
        Person p;
        cout << "请输入添加人姓名" << endl;
        cin >> p.name;
        cout << "请输入添加人年龄" << endl;
        cin >> p.age;
        int sexNum = 1;
        cout << "请输入添加人性别： 1--男；2--女" << endl;
        do
        {
            cin >> sexNum;
            if (sexNum == 1)
            {
                p.sex = "男";
                break;
            }
            else if (sexNum == 2)
            {
                p.sex = "女";
                break;
            }
            else
            {
                cout << "输入不合规范，请重新输入" << endl;
            }
        } while (true);
        abs->personArray[flag].name = p.name;
        abs->personArray[flag].age = p.age;
        abs->personArray[flag].sex = p.sex;
    }
}

// 清空联系人
void clearPersonArray(AddressBook *abs)
{
    abs->m_size = 0;
    cout << "通讯录已经清空" << endl;
}
int main()
{
    int select = 0;
    bool isExit = false;
    // 创建通讯录结构体变量
    AddressBook abs;
    // 初始化通讯录
    abs.m_size = 0;

    do
    {
        showMenu();
        cout << "请输入您要进行的操作编号" << endl;
        cin >> select;
        switch (select)
        {
        case 0:
            cout << "已退出该通讯录系统，欢迎下次使用" << endl;
            isExit = true;
            break;
        case 1: // 1、添加联系人
            if (abs.m_size >= MAX)
            {
                /* code */
                cout << "人数超过了最大值,不能继续输入" << endl;
                break;
            }
            addPerson(&abs);
            break;
        case 2: // 2、显示联系人
            showPerson(&abs);
            break;
        case 3: // 3、删除联系人
            deletePerson(&abs);
            break;
        case 4: // 4、查找联系人
            findPerson(&abs);
            break;
        case 5: // 5、修改联系人
            editPerson(&abs);
            break;
        case 6: // 6、清空联系人
            clearPersonArray(&abs);
            break;
        default:
            cout << "您的输入有误，请重新输入" << endl;
            break;
        }
    } while (!isExit);

    return 0;
}